package teaching.models;

import teaching.data.LearningSet;
import teaching.data.Vecteur;
import teaching.tools.Draw;

public class PerceptronHinge implements ScoringFunction
{
	Vecteur theta;
	int nb_iter = 1000;
	double pas = 0.001;
	double gamma = 0.00;
	
	public PerceptronHinge (int size){
		theta = new Vecteur(size);
	}
	
	public void thetaprim()
	{
		theta.nbPlus(1);
	}
	public void learn(LearningSet s)
	{
		for (int i=1 ; i<=nb_iter ; i++){
			int fini = 1;
			Vecteur tempo = new Vecteur(theta.size());
			for (int z=0;z<tempo.size();z++){
				tempo.setValue(z, 0);	
			}
			for (int j=0 ; j<s.size(); j++)
			{
				if (s.getLabel(j) * theta.computeDOTProduct(s.getVector(j)) <= 1)
						{
							Vecteur temp = new Vecteur(s.getVector(j));
							temp.product((pas*10./i)*s.getLabel(j));
							tempo.add(temp);
							fini = 0;
						}
			}
			if (fini == 1){break;}
			theta.product(1-gamma*(pas/i));
			theta.add(tempo);
			System.out.println(i+" Accuracy is : "+Draw.computeAccuracy(s, this, 0.0)+" %");
			System.out.println("vecteur theta = ("+theta+") de taille "+theta.size());
			/**System.out.println("")*/
		}
	
	}
	
	@Override
	public double getScore(Vecteur v) {
		if (theta.computeDOTProduct(v) > 0)
		{
			return(1);
		}
		return(-1);
		//return(theta.computeDOTProduct(v));
	}

}
